package io.lvdaxian.mybatis07.reflection.invoker;

import java.lang.reflect.Method;

/**
 * 方法调用者
 *
 * @author lihh
 */
public class MethodInvoker implements Invoker {
  private final Class<?> type;
  private final Method method;
  
  public MethodInvoker(Method method) {
    this.method = method;
    
    // 如果只有一个参数，返回参数类型，否则返回 return 类型
    if (1 == method.getParameterTypes().length)
      type = method.getParameterTypes()[0];
    else
      type = method.getReturnType();
  }
  
  /**
   * 外部包装的执行方法
   *
   * @param target 方法所属实例
   * @param args   参数
   * @return 返回方法结果
   * @throws Exception 异常
   * @author lihh
   */
  @Override
  public Object invoke(Object target, Object[] args) throws Exception {
    return method.invoke(target, args);
  }
  
  @Override
  public Class<?> getType() {
    return type;
  }
}
